package com.itheima.tlias84.controller;

import com.itheima.tlias84.dto.SelectStudentDTO;
import com.itheima.tlias84.entity.Student;
import com.itheima.tlias84.utils.ResultUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 *DI: 从ioc容器中，获取已经创建好的对象给属性(成员变量)赋值
 *
 * 给一个类的属性(成员变量)赋值的4种方式：1、直接等于号=赋值
 *                                 2、构造器赋值
 *                                 3、set方法赋值（建造者的底层逻辑就是set方法）
 *                                 4、反射
 * @Autowired 一般使用在构造器和set方法赋值时，对应2+3
 * @Resource 对应1+4
 * 所以：springDI注入有3种方式 1、@Resource 字段(属性)DI
 *                          2、@Autowired 构造器DI
 *                          3、@Autowired set方法DI
 * 两个注解的使用选择：@Resource-->springBean类中需要注入很少其它类的bean对象时使用
 *                 @Autowired --> springBean类中需要注入很多其它类的bean对象时使用
 *                                可以基于lombok实现构造器注入
 *
 * sptingBean注入时要注意的问题：
 * 1、非Bean 不能调用Bean
 * 2、不能形成循环依赖-->然后解决？
 */
@Slf4j
@RestController
@RequestMapping("/context")
public class TestApplicationtContextController {

    @Resource
    ApplicationContext context;
    @Resource(name = "zhangsan")
    Student student;
    @Autowired
    SelectStudentDTO lisi;

    public ResultUtil getBean() {
        log.info("获取学生bean：{}", student);
        Object zhangsan = context.getBean("zhangsan");
        log.info("获取学生bean：{}", zhangsan);

        log.info("获取lisi：{}", lisi);
        Object bean = context.getBean("lisi");
        log.info("获取lisi：{}", bean);
        return ResultUtil.success();
    }
}
